package smallfrench.moteur.biblio;

import smallfrench.moteur.lexer.Position;

/**
 * Classe immuable représentant une position dans un fichier.
 * Plus complète (et plus lourde) que {@link Position}, et peut être
 * manipulée par un script.
 *
 */
public class APosition extends AObjet {

	public static final AClasse CLASSE = AClasse.creer(APosition.class, "Position");

	/** Le nom du fichier ou <code>null</code> */
	public final String nomFichier;

	/** Le nom de la fonction ou <code>null</code> */
	public final String nomFonction;

	/** Le numéro de la ligne, ou une valeur négative si
	 * l'information n'est pas disponible. */
	public final int ligne;

	/** Le numéro de la colonne, ou une valeur négative si
	 * l'information n'est pas disponible. */
	public final int colonne;

	/** Le numéro de l'index, ou une valeur négative si
	 * l'information n'est pas disponible. */
	public final int index;



	@AnnotationMembre
	public APosition(RChaine nomFichier, RChaine nomFonction,
			REntier ligne, REntier colonne, REntier index) {

		this(nomFichier.valeur, nomFonction.valeur,
				ligne.getValeurInt(), colonne.getValeurInt(),
				index.getValeurInt());
	}


	public APosition(String nomFichier, String nomFonction,
			int ligne, int colonne, int index) {

		this.nomFichier = nomFichier;
		this.nomFonction = nomFonction;
		this.ligne = ligne;
		this.colonne = colonne;
		this.index = index;
	}


	/**
	 * 
	 * @param position
	 * @param nomFichier Le nom du fichier ou <code>null</code>.
	 */
	public APosition(Position position, String nomFichier) {
		this(nomFichier, null,
				position.ligne, position.colonne, position.index);
	}


	@AnnotationMembre
	public RChaine obtenirNomFichier() {
		return new RChaine(nomFichier);
	}


	@AnnotationMembre
	public RChaine obtenirNomFonction() {
		return new RChaine(nomFonction);
	}


	@AnnotationMembre
	public REntier obtenirLigne() {
		return new REntier(ligne);
	}


	@AnnotationMembre
	public REntier obtenirColonne() {
		return new REntier(colonne);
	}


	@AnnotationMembre
	public REntier obtenirIndex() {
		return new REntier(index);
	}


	@Override
	public RChaine enChaine() {
		return null;
	}
}
